! function (e, t) {
    "object" == typeof exports && "object" == typeof module ? module.exports = t() : "function" == typeof define &&
    define.amd ? define([], t) : "object" == typeof exports ? exports.jutils = t() : e.jutils = t()
}(this, (function () {
    return function (e) {
        var t = {};

        function r(n) {
            if (t[n]) return t[n].exports;
            var o = t[n] = {
                i: n,
                l: !1,
                exports: {}
            };
            return e[n].call(o.exports, o, o.exports, r), o.l = !0, o.exports
        }
        return r.m = e, r.c = t, r.d = function (e, t, n) {
            r.o(e, t) || Object.defineProperty(e, t, {
                enumerable: !0,
                get: n
            })
        }, r.r = function (e) {
            "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {
                value: "Module"
            }), Object.defineProperty(e, "__esModule", {
                value: !0
            })
        }, r.t = function (e, t) {
            if (1 & t && (e = r(e)), 8 & t) return e;
            if (4 & t && "object" == typeof e && e && e.__esModule) return e;
            var n = Object.create(null);
            if (r.r(n), Object.defineProperty(n, "default", {
                enumerable: !0,
                value: e
            }), 2 & t && "string" != typeof e)
                for (var o in e) r.d(n, o, function (t) {
                    return e[t]
                }.bind(null, o));
            return n
        }, r.n = function (e) {
            var t = e && e.__esModule ? function () {
                return e.default
            } : function () {
                return e
            };
            return r.d(t, "a", t), t
        }, r.o = function (e, t) {
            return Object.prototype.hasOwnProperty.call(e, t)
        }, r.p = "", r(r.s = 0)
    }([function (e, t, r) {
        let n = {};
        const o = r(1);
        o.keys().forEach(e => {
            if ("./index.js" !== e)
                for (var t in o(e)) n[t] = o(e)[t]
        }), e.exports = n
    }, function (e, t, r) {
        var n = {
            "./array/array.js": 2,
            "./browser/browser.js": 3,
            "./cache/storage.js": 4,
            "./date/date.js": 5,
            "./devices/devices.js": 6,
            "./index.js": 0,
            "./mobile/mobile.js": 7,
            "./string/string.js": 8,
            "./url/url.js": 9,
            "./validate/validate.js": 10
        };

        function o(e) {
            var t = i(e);
            return r(t)
        }

        function i(e) {
            if (!r.o(n, e)) {
                var t = new Error("Cannot find module '" + e + "'");
                throw t.code = "MODULE_NOT_FOUND", t
            }
            return n[e]
        }
        o.keys = function () {
            return Object.keys(n)
        }, o.resolve = i, e.exports = o, o.id = 1
    }, function (e, t) {
        e.exports = {
            arrayUniq: function (e) {
                for (var t = [], r = 0, n = e.length; r < n; r++)("," + t + ",").indexOf(
                    "," + e[r] + ",") < 0 && t.push(e[r]);
                return t
            }
        }
    }, function (e, t) {
        var r = {
            getBrowserInfo: function () {
                var e, t, r, n = {
                        name: "other",
                        version: "0"
                    },
                    o = navigator.userAgent.toLowerCase();
                for (t = [["WeiXin", /micromessenger\/([^\s]+)/], ["QQ", /qq\/([^\s]+)/], [
                    "QQBrowser", /(?:qqbrowser|qqlivebrowser)\/([^\s]+)/], ["JDAPP",
                    /jdapp;/], ["QIHU", /qihu|360se/], ["LieBao",
                    /(?:lbbrowser|liebaofast)\/?([\d\.]+)?/], ["Sogou",
                    /(?:metasr|sogou[\w]*)[ \/]([\d\.]+)/], ["Opera",
                    /(?:opera|opr|oupeng)\/([\d\.]+)/], ["BaiduBrowser",
                    /(?:bidubrowser|baidubrowser)[\/ ]?([\d\.\w]+)/], ["BaiduBox",
                    /baiduboxapp|baiduboxpad/], ["UC",
                    /(?:ucweb|ucbrowser)\/?([\d\.]+)/], ["Maxthon",
                    /maxthon\/([\d\.]+)/], ["Samsung", /samsungbrowser\/([\d\.]+)/],
                    ["Dolphin", /aphone|apad/], ["2345", /2345/], ["Miui",
                        /miuibrowser\/([\d\.]+)/], ["OppoBrowser",
                        /oppobrowser\/([\d\.]+)/], ["MeiZu", /mz-/], ["Weibo", /weibo/],
                    ["Youku", /youku/], ["NewsApp", /newsapp/], ["AliApp", /aliapp/], [
                        "Firefox", /firefox\/([\d\.\w]+)/], ["Chrome",
                        /chrome\/([\d\.]+)/], ["IE", /msie[ ](\d+\.\d+)/], ["Safari",
                        /safari\/([\d\.]+)/]], e = 0; e < t.length; e++)
                    if (r = o.match(t[e][1])) {
                        n.name = t[e][0], n.version = r[1] || "0";
                        break
                    } return n
            },
            isCss3Support: function () {
                var e, t, r, n = {
                        TransitionEvent: "transitionend",
                        WebKitTransitionEvent: "webkitTransitionEnd",
                        OTransitionEvent: "oTransitionEnd",
                        otransitionEvent: "otransitionEnd"
                    },
                    o = !1;
                for (r in n) {
                    if (window[r]) {
                        e = n[r];
                        break
                    }
                    try {
                        document.createEvent(r), e = n[r];
                        break
                    } catch (e) {}
                }
                for (r in "string" == typeof e && (o = !0), n = {
                    AnimationEvent: "animationend",
                    WebKitAnimationEvent: "webkitAnimationEnd"
                })
                    if (window[r]) {
                        t = n[r];
                        break
                    } return "string" == typeof t && (o = !0), o
            }
        };
        e.exports = r
    }, function (e, t) {
        var r = {
            removeStorage: function (e) {
                window.localStorage.removeItem(e)
            },
            saveStorage: function (e, t, r) {
                try {
                    window.localStorage.setItem(e, r ? JSON.stringify(t) : t)
                } catch (e) {
                    console.error(e)
                }
            },
            getStorage: function (e) {
                return window.localStorage.getItem(e)
            },
            isSupportStorage: function () {
                if (!window.localStorage) return !1;
                try {
                    return window.localStorage.setItem("JUTILS_STOARGE_TEST", !0), window.localStorage
                        .removeItem("JUTILS_STOARGE_TEST"), !0
                } catch (e) {
                    return !1
                }
            }
        };
        e.exports = r
    }, function (e, t) {
        function r(e, t) {
            for (var r = 0, n = t - (e + "").length; r < n; r++) e = "0" + e;
            return e + ""
        }
        var n = {
            isDuringDate: function (e, t) {
                var r = new Date,
                    n = new Date(e),
                    o = new Date(t);
                return r >= n && r <= o
            },
            getDayType: function (e, t) {
                var r = e.split("-"),
                    n = r[0].split(":"),
                    o = r[1].split(":"),
                    i = parseInt(n[0]),
                    a = parseInt(o[0]),
                    s = "";
                return i >= 0 && a <= 12 && (s = "上午"), i >= 12 && a <= 18 && (s = "下午"), i >=
                18 && a <= 24 && (s = "晚间"), t && i >= 11 && a <= 13 && (s = "中午"), s
            },
            getTimeInterval: function (e, t) {
                var r = [0, 0, 0, 0],
                    n = "",
                    o = t > e ? parseInt((t - e) / 1e3) : 0;
                return r[0] = o > 86400 ? parseInt(o / 86400) : 0, o -= 86400 * r[0], r[1] =
                    o > 3600 ? parseInt(o / 3600) : 0, o -= 3600 * r[1], r[2] = o > 60 ?
                    parseInt(o / 60) : 0, r[3] = o - 60 * r[2], n = r[0] > 0 ? r[0] + "天" :
                    "", n += r[0] <= 0 && r[1] <= 0 ? "" : r[1] + "小时", n += r[0] <= 0 && r[
                    1] <= 0 && r[2] <= 0 ? "" : r[2] + "分钟", n += r[0] <= 0 && r[1] <=
                0 && r[2] <= 0 && r[3] <= 0 ? "" : r[3] + "秒"
            },
            formatDate: function (e, t) {
                return t.replace(/yyyy|YYYY/, e.getFullYear()).replace(/yy|YY/, r(e.getFullYear() %
                    100, 2)).replace(/mm|MM/, r(e.getMonth() + 1, 2)).replace(/m|M/g, e
                    .getMonth() + 1).replace(/dd|DD/, r(e.getDate(), 2)).replace(/d|D/g,
                    e.getDate()).replace(/hh|HH/, r(e.getHours(), 2)).replace(/h|H/g, e
                    .getHours()).replace(/ii|II/, r(e.getMinutes(), 2)).replace(/i|I/g,
                    e.getMinutes()).replace(/ss|SS/, r(e.getSeconds(), 2)).replace(
                    /s|S/g, e.getSeconds()).replace(/w/g, e.getDay()).replace(/W/g, [
                    "日", "一", "二", "三", "四", "五", "六"][e.getDay()])
            }
        };
        e.exports = n
    }, function (e, t) {
        var r = {
            getOsInfo: function (e) {
                e = e || navigator.userAgent;
                for (var t = {
                    os: "other",
                    version: ""
                }, r = [["android", /Android;?[\s\/]+([\d.]+)?/], ["android",
                    /jdapp;android;[\d.]+;([\d.]+);/], ["android",
                    /[aA]ndroid;/], ["ipad", /iPad;.*?OS\s([\d_]+)/], ["ipod",
                    /iPod(?:\stouch)?;.*?\sOS\s([\d_]+)?/], ["iphone",
                    /CPU\siPhone\s(?:OS\s)?([\d_]+)/], ["windows", /Windows NT/],
                    ["mac", /Macintosh;.*?Mac OS X\s([\d._]+)/], ["windows phone",
                        /Windows Phone\s([\d.]+)?/], ["symbianos",
                        /SymbianOS\/([\d.]+)?/], ["bb",
                        /BlackBerry|BB10|RIM Tablet OS\s([\d.]+)?/], ["linux",
                        /linux/i]], n = 0; n < r.length; n++) {
                    var o = r[n],
                        i = e.match(o[1]);
                    if (i) {
                        t.os = o[0], t.version = (i[1] || "").replace(/_/g, ".");
                        break
                    }
                }
                return t
            }
        };
        e.exports = r
    }, function (e, t) {
        var r = {
            isSQ: function () {
                return !!/qq\/([\d\.]+)*/i.test(navigator.userAgent)
            },
            isWX: function () {
                return !!/MicroMessenger/i.test(navigator.userAgent)
            },
            getOperator: function (e, t) {
                var r = e || "",
                    n = r.substring(0, 3),
                    o = r.substring(0, 4),
                    i = !!/^1\d{10}$/.test(r) && ("130,131,132,155,156,185,186,145,176".indexOf(
                        n) >= 0 ? "联通" : "133,153,180,181,189,177,173,170".indexOf(n) >=
                    0 ? "电信" : "1349" == o ? "电信" :
                        "134,135,136,137,138,139,150,151,152,157,158,159,187,188,147,182,183,184,178"
                            .indexOf(n) >= 0 ? "移动" : "未知");
                return t || i || !/^1\d{2}\*{4}\d{4}$/.test(r) || (i = !0), i
            }
        };
        e.exports = r
    }, function (e, t) {
        var r = {
            strSubGB: function (e, t, r, n) {
                if (e.replace(/[\u00FF-\uFFFF]/g, "  ").length > r - t) {
                    n = n || "";
                    var o = e.replace(/[\u00FF-\uFFFF]/g, "@-").substr(t, r),
                        i = o.match(/@-/g) ? o.match(/@-/g).length : 0;
                    return e.substring(0, r - i) + n
                }
                return e
            }
        };
        e.exports = r
    }, function (e, t) {
        var r = {
            getQuery: function (e, t) {
                var r = arguments[1] || window.location.search,
                    n = new RegExp("(^|&)" + e + "=([^&]*)(&|$)"),
                    o = r.substr(r.indexOf("?") + 1).match(n);
                return null != o ? o[2] : ""
            },
            setQuery: function (e, t) {
                var r = t ? t.match(/#.*/) && t.match(/#.*/)[0] || "" : location.hash,
                    n = t ? t.replace(/#.*/, "").match(/\?.*/) && t.replace(/#.*/, "").match(
                        /\?.*/)[0] || "" : location.search,
                    o = t ? t.replace(/#.*/, "").replace(/\?.*/, "") : location.protocol +
                        "//" + location.host + location.pathname;
                for (var i in e) {
                    var a = i + "=" + e[i],
                        s = getQuery(i, n);
                    n = s ? n.replace(i + "=" + s, i + "=" + e[i]) : n.length > 0 ? n + "&" +
                        a : "?" + a
                }
                return o + n + r
            },
            getUrlParam: function (e) {
                var t = arguments[1] || window.location.search,
                    r = new RegExp("(^|&)" + e + "=([^&]*)(&|$)", "i"),
                    n = t.substr(t.indexOf("?") + 1).match(r);
                return null != n ? n[2] : ""
            },
            getHash: function (e) {
                var t = arguments[1] || location.hash,
                    r = new RegExp("(^|&)" + e + "=([^&]*)(&|$)"),
                    n = t.substr(t.indexOf("#") + 1).match(r);
                return null != n ? n[2] : ""
            },
            replaceParam: function (e, t, r, n) {
                r = r || location.href;
                var o = new RegExp("([\\?&]" + e + "=)[^&#]*");
                return r.match(o) ? n ? r.replace(o, "$1" + t) : r : -1 == r.indexOf("?") ?
                    r + "?" + e + "=" + t : r + "&" + e + "=" + t
            },
            loadCss: function (e) {
                var t = document.createElement("link");
                t.setAttribute("type", "text/css"), t.setAttribute("rel", "stylesheet"), t.setAttribute(
                    "href", e), document.getElementsByTagName("head")[0].appendChild(t)
            },
            loadonJS: function (e, t, r) {
                "string" == typeof t && (r = t, t = function () {});
                var n = document.createElement("script"),
                    o = document.getElementsByTagName("head")[0];
                n.setAttribute("charset", r || "utf-8"), n.src = e, n.onload = function () {
                    t && t(), o.removeChild(n)
                }, o.appendChild(n)
            }
        };
        e.exports = r
    }, function (e, t) {
        var r = {
            checkUserId: function (e) {
                var t, r, n, o, i, a, s, u;
                if (i = ["1", "0", "x", "9", "8", "7", "6", "5", "4", "3", "2"], a = ["7",
                    "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5",
                    "8", "4", "2"], t = "", !e) return "身份证号码不能为空";
                if (18 != e.length) return "身份证号码长度应该为18位";
                if (18 == e.length ? t = e.substring(0, 17) : 15 == e.length && (t = e.substring(
                    0, 6) + "19" + e.substring(6, 15)), !/^\d+$/.test(t)) return "身份证格式错误";
                if (r = t.substring(6, 10), n = t.substring(10, 12), o = t.substring(12, 14),
                0 == /[1-9]\d{3}\-(0[1-9]|1[0-2])\-([0-2]\d|3[0-1])/.test(r + "-" + n +
                    "-" + o)) return "身份证生日无效。";
                if ((new Date).getFullYear() - r > 150 || (new Date).getTime() - new Date(r,
                    n - 1, o).getTime() < 0) return "身份证生日不在有效范围";
                if (n > 12 || 0 == n) return "身份证月份无效";
                if (o > 31 || 0 == o) return "身份证日期无效";
                if (!{
                    11: "北京",
                    12: "天津",
                    13: "河北",
                    14: "山西",
                    15: "内蒙古",
                    21: "辽宁",
                    22: "吉林",
                    23: "黑龙江",
                    31: "上海",
                    32: "江苏",
                    33: "浙江",
                    34: "安徽",
                    35: "福建",
                    36: "江西",
                    37: "山东",
                    41: "河南",
                    42: "湖北",
                    43: "湖南",
                    44: "广东",
                    45: "广西",
                    46: "海南",
                    50: "重庆",
                    51: "四川",
                    52: "贵州",
                    53: "云南",
                    54: "西藏",
                    61: "陕西",
                    62: "甘肃",
                    63: "青海",
                    64: "宁夏",
                    65: "新疆",
                    71: "台湾",
                    81: "香港",
                    82: "澳门",
                    91: "国外"
                } [t.substring(0, 2)]) return "身份证地区编码错误";
                for (u = 0, s = 0; s < 17; s++) u += t.charAt(s) * a[s];
                return t += i[u % 11], 18 != e.length ? "" : t != e.toLowerCase() ?
                    "不是合法的身份证号码" : ""
            }
        };
        e.exports = r
    }])
}));